package org.meetunexpectedly.config;

import com.qiniu.storage.Region;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Description:
 * @Author: pupil
 * @Date: 2024/08/17 下午 7:26
 */
@Data
@Component
@ConfigurationProperties(prefix = "qiniu.kodo")
public class QiNiuConfig {

    // 账号
    private String accessKey;
    // 密钥
    private String secretKey;
    // 存储空间名
    private String bucketName;

    // 亚太-新加坡地区
    private Region region = Region.regionAs0();

    // 存储空间域名
    public static final String RealmName = "http://skbbaamnh.sabkt.gdipper.com";
    // 视频审核地址
    public static final String VIDEO_URL = "http://ai.qiniuapi.com/v3/video/censor";
    // 图片审核地址
    public static final String IMAGE_URL = "http://ai.qiniuapi.com/v3/image/censor";

    // 视频转码(转成MP4)
    public static final String fops = "avthumb/mp4";

    /**
     * 创建七牛云身份认证模块
     * Auth 类的主要用途包括：
     * (1)生成上传凭证：在上传文件到七牛云时，需要生成上传凭证（token），以便七牛云验证请求的合法性。
     * (2)生成下载凭证：在下载受保护的资源时，需要生成下载凭证，以便七牛云验证请求的合法性。
     * (3)生成请求签名：在调用七牛云 API 时，需要对请求进行签名，以便七牛云验证请求的合法性。
     *
     * @return
     */
    public Auth buildAuth() {
        String accessKey = this.accessKey;
        String secretKey = this.secretKey;
        return Auth.create(accessKey, secretKey);
    }

    /**
     * 生成上传token
     * auth.uploadToken(bucket,key,expires,policy)
     * bucket - 空间名
     * key 可为 null
     * expires - 有效时长，单位秒
     * policy - 上传策略  mimeLimit 限定用户上传的文件类型（video/image）
     *
     * @return
     */
    public String uploadToken() {
        Auth auth = buildAuth();
        return auth.uploadToken(bucketName, null, 300,
                new StringMap().put("mimeLimit", "video/*;image/*"));
    }

    /**
     * 生成视频上传token
     * auth.uploadToken(bucket,key,expires,policy)
     * bucket - 空间名
     * key 可为 null
     * expires - 有效时长，单位秒
     * policy - 上传策略 mimeLimit 限定用户上传的文件类型（video）
     * persistentOps  预转持久化处理   进行视频转码
     *
     * @return
     */
    public String videoUploadToken() {
        Auth auth = buildAuth();
        return auth.uploadToken(bucketName, null, 300,
                new StringMap().put("mimeLimit", "video/*").putNotEmpty("persistentOps", fops));
    }

    /**
     * 生成图片上传token
     * auth.uploadToken(bucket,key,expires,policy)
     * bucket - 空间名
     * key 可为 null
     * expires - 有效时长，单位秒
     * policy - 上传策略  mimeLimit 限定用户上传的文件类型（image）
     *
     * @return
     */
    public String imageUploadToken() {
        Auth auth = buildAuth();
        return auth.uploadToken(bucketName, null, 300,
                new StringMap().put("mimeLimit", "image/*"));
    }

    /**
     * 获取审核七牛云请求签名字符串(token)
     *
     * @param url         签名请求的 url(网络资源)
     * @param method      签名请求的 method（post/get...）
     * @param body        签名请求的 body(请求体)
     * @param contentType 签名请求的 contentType(内容类型)
     * @return
     */
    public String getAuditToken(String url, String method, String body, String contentType) {
        Auth auth = buildAuth();
        //  生成 HTTP 请求签名字符串
        String qiniuToken = "Qiniu " + auth.signQiniuAuthorization(url, method, body == null ? null : body.getBytes(), contentType);
        return qiniuToken;
    }
}
